perm filename MOVARM.SAI[PNT,HE]4 blob
sn#346139 filedate 1978-04-05 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00006 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY
C00005 00003 ⊃ PROCEDURES FOR GENERATING CODE OF THE PDP-11
C00008 00004 INTERNAL PROCEDURE MOVE(RPTR(FRAME)F_ARM,DEST REAL TT(2.0))
C00011 00005 INTERNAL PROCEDURE DRIVE(INTEGER ARM,J,ABSREL REAL AMNT,TT(2.0))
C00013 00006 INTERNAL PROCEDURE CENTER(INTEGER ARM)
C00014 ENDMK
C⊗;
ENTRY;
BEGIN "MOVE - GENERATES SIMPLE TRAJECTORY AND SENDS DATA TO BLUE ARM"
COMMENT ALL [PNT,HE] FILES COPIED OVER FROM [PNT,MSM] DEC 30,1977 ;
DEFINE ⊃="COMMENT";
REQUIRE "MACROS.SAI[PNT,HE]" SOURCE_FILE;
REQUIRE "MOVE.DEF[PNT,HE]" SOURCE_FILE;
REQUIRE "RECORD.DEF[PNT,HE]" SOURCE_FILE;
INTEGER SEGS,TNUM,JTS,I,J,K;
INTEGER ARRAY DATA[1:1000];
INTEGER DUM, PTR;
REAL ARRAY DD[1:20],OLD[1:7],NEW[1:7];
INTERNAL REAL BHAND;
EXTERNAL PROCEDURE read_arm(integer arm);
REQUIRE "BEJCZY[PNT,HE]" LOAD_MODULE; COMMENT ACTUALLY FROM BEJCZY[11,BES];
EXTERNAL PROCEDURE DTERMS(REAL ARRAY DD;REFERENCE REAL TH;INTEGER ARM);
COMMENT REQUIRE "FAITRG.FAI[PNT,HE]" LOAD_MODULE; COMMENT FROM 1,BES;
REQUIRE "TLKEF3.FAI[PNT,HE]" LOAD_MODULE; COMMENT FROM 11,BES;
EXTERNAL PROCEDURE TLKEF3(INTEGER MASTER;INTEGER ARRAY DATA);
REQUIRE "ARMSOL.SAI[PNT,HE]" LOAD_MODULE;
EXTERNAL INTEGER PROCEDURE ARMSOL(INTEGER ARM; REAL ARRAY B; RPTR(FRAME)T);
EXTERNAL SAFE REAL ARRAY LOSTOP, HISTOP, TIMFAC[0:1,1:7];
DEFINE MASTER="'54321";
DEFINE MOVE_CODE= "'76";
DEFINE CENTER_CODE= "'67";
EXTERNAL STRING ARRAY ARMERR[1:6];
EXTERNAL PROCEDURE ABORT1(STRING S1,S2(NULL));
EXTERNAL REAL ARRAY BANGLE,YANGLE[1:7];
⊃ PROCEDURES FOR GENERATING CODE OF THE PDP-11;
SIMPLE PROCEDURE INTOUT(INTEGER NUM);
BEGIN
DATA[PTR]←NUM;
PTR←PTR+1;
END;
⊃ PROCEDURE FOR SAVING A FLOATING POINT NUMBER IN 11 FORMAT IN THE DATA ARRAY;
SIMPLE PROCEDURE FLTOUT(REAL FNUM);
BEGIN
LABEL ST1,ST2,OVER,FLTEND;
INTEGER BYTE,NUM1,NUM2;
BYTE←'013200000002;
START_CODE
MOVE 2,FNUM;
JUMPGE 2,ST1;
MOVN 2,2;
TLO 2,'400000;
ST1: JFCL 2,ST2;
ST2: ADDI 2,4;
JFCL 2,OVER;
DPB 2,BYTE;
SETZ 1,;
LSHC 1,16;
MOVEM 1,NUM1;
SETZ 1,;
LSHC 1,16;
MOVEM 1,NUM2;
END;
DATA[PTR]←NUM1;
PTR←PTR+1;
DATA[PTR]←NUM2;
PTR←PTR+1;
GOTO FLTEND;
OVER: OUTSTR("ERROR-ROUNDING OVERFLOW"&CRLF);
FLTEND: END;
INTERNAL PROCEDURE MOVE(RPTR(FRAME)F_ARM,DEST; REAL TT(2.0));
BEGIN "MOVE"
INTEGER JTS,TIME,SEGPTR,JOINT,FLAG;
INTEGER MECH,BITS,ARM;
REAL DIF; REAL ARRAY DIFA[1:6];
IF F_ARM=F_BARM
THEN BEGIN DUM←0; ARM←BLUE; MECH←BARM_MECH; BITS←BARMSB; END
ELSE BEGIN DUM←1; ARM←YELLOW;MECH←YARM_MECH; BITS←YARMSB; END;
READ_ARM(ARM); ARRTRAN(NEW,BANGLE);
⊃ SET UP THE COEFFICIENT LIST HEADER;
SETFORMAT(10,3);
JTS←6;
SEGPTR←8+JTS*32;
PTR←1;
⊃ ***** ; INTOUT(MOVE_CODE);
INTOUT(BITS);
INTOUT(0);
INTOUT(0);
INTOUT(0); ⊃ WOBBLE;
FLAG←ARMSOL(ARM,NEW,DEST); ⊃ GIVES THE ANGLES OF THE NEW TRANSFORM;
IF FLAG>0 THEN
BEGIN
STRING S; INTEGER I;
S←CRLF&"CANT MOVE THERE. FOLLOWING JOINT(S) OUT OF RANGE: ";
FOR I←1 STEP 1 UNTIL 7
DO IF FLAG LAND (2↑(I-1)) THEN S← S&" "&CVS(I)&",";
IF FLAG LAND '200 THEN ABORT1(CRLF&"TRYING TO PUSH ARM THROUGH TABLE");
ABORT1(S[1 TO ∞ - 1]);
END;
TIME←TT*1000;
FOR J←1 STEP 1 UNTIL JTS DO BEGIN
DIFA[J]←NEW[J] - OLD[J];
TIME← TIME MAX (1000 + ABS(DIFA[J])*TIMFAC[ARM,J]/30*1000);
END;
INTOUT(SEGPTR);
INTOUT(TIME);
INTOUT(0); INTOUT(0);
⊃ WRITE OUT THE POLYNOMIAL AND DYNAMIC COEFFICIENTS;
FOR J←1 STEP 1 UNTIL JTS DO BEGIN
JOINT←J;
DIF←DIFA[JOINT];
FLTOUT(OLD[JOINT]);
FLTOUT(0.0); FLTOUT(0.0);
FLTOUT(10.0*DIF);
FLTOUT(-15.0*DIF);
FLTOUT(6.0*DIF);
END;
! *************** DTERMS(DD,NEW[1],DUM);
DTERMS(DD,NEW[1],MECH);
FOR J←1 STEP 1 UNTIL JTS DO BEGIN
K←(J-1)*2+1;
FLTOUT(DD[K]);
FLTOUT(DD[K+1]);
END;
INTOUT(0);
TLKEF3(MASTER,DATA); ⊃ tell to move;
END "MOVE";
PRESET_WITH '100000,'40000,'20000,'10000,'4000,'2000,'1000,
'400,'200,'100,'40,'20,'10,'4;
INTEGER ARRAY JT_CODE[0:1,1:7];
INTERNAL PROCEDURE DRIVE(INTEGER ARM,J,ABSREL; REAL AMNT,TT(2.0));
BEGIN "DRIVE"
⊃ DRIVES ONE JOINT;
INTEGER JTS,SEGPTR,TIME,BITS,K1;
REAL DIF, OLDJ,NEWJ;
DUM ←IF J=7 THEN IF ARM=BLUE THEN BHAND_MECH ELSE YHAND_MECH
ELSE IF ARM=BLUE THEN BARM_MECH ELSE YARM_MECH;
BITS←JT_CODE[ARM,J];
READ_ARM(ARM); ARRTRAN(OLD,BANGLE);
OLDJ←OLD[J];
IF ABSREL = ABS_MOTION THEN DIF←(NEWJ←AMNT)- OLDJ
ELSE NEWJ←OLDJ+(DIF←AMNT);
IF ¬(LOSTOP[ARM,J]≤NEWJ≤HISTOP[ARM,J]) THEN
ABORT1(CRLF&"TRYING TO DRIVE JT["&CVS(J)&"] TO "&
CVF(NEWJ)&" WHICH IS OUTSIDE JOINT LIMITS "&
CVF(LOSTOP[ARM,J])&" AND "&CVF(HISTOP[ARM,J]));
JTS←1; PTR←1; SEGPTR←8+JTS*32;
SETFORMAT(10,3);
INTOUT(MOVE_CODE);
INTOUT(BITS);
INTOUT(0);
INTOUT(0);
INTOUT(0);
TIME←(TT MAX (ABS(TIMFAC[ARM,J]*DIF/30.0)+1))*1000;
INTOUT(SEGPTR);
INTOUT(TIME);
INTOUT(0);
INTOUT(0);
FLTOUT(OLDJ);
FLTOUT(0.0);FLTOUT(0.0);
FLTOUT(10.0*DIF);
FLTOUT(-15.0*DIF);
FLTOUT(6.0*DIF);
FOR K1←1 STEP 1 UNTIL 7 DO NEW[K1]←OLD[K1];
NEW[J]←NEWJ;
DTERMS(DD,NEW[1],DUM);
IF J=7 THEN K←1 ELSE K←(J -1)*2 +1;
FLTOUT(DD[K]);
FLTOUT(DD[K+1]);
INTOUT(0);
TLKEF3(MASTER,DATA); ⊃ TELL TO MOVE;
END "DRIVE";
INTERNAL PROCEDURE CENTER(INTEGER ARM);
BEGIN "CENTER"
INTEGER BITS;
IF ARM=BLUE THEN BITS←(BARMSB+BHANDSB) ELSE BITS←(YHANDSB+YARMSB);
PTR←1;
INTOUT(CENTER_CODE);
INTOUT(BITS);
INTOUT(0);
INTOUT(0);
INTOUT(0); ⊃ NO WOBBLE;
INTOUT(0); ⊃ NO NEXT SEGMENT;
INTOUT(0); ⊃ NO FUNCTION TIME;
INTOUT(0); ⊃ NO TRANSFORM;
INTOUT(0);
INTOUT(0);
TLKEF3(MASTER,DATA);
END "CENTER";
END;